// 获取是索引类型的 所有的属性
function pluck(o,names){
    return names.map(n => o[n])
}

// 使用ts 写法
function plucks<T,K extends keyof T>(o:T,names:K[]):T[K][]{
    return names.map(n => o[n])
}

interface Person {
    name:string,
    age:number
}

let person:Person = {
    name:"hhh",
    age:18
}

let strings:string[] = plucks(person,['name'])
// 此时报错的原因，因为第二个参数不确定，是 name 就是 string [] 是age 就是 number[]
// 所以这个list 有两个返回类型
let list:number[] = plucks(person,['age']) // 还有自动补全的校验提示
console.log(strings)
// 索引访问操作符
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
    return o[name]; // o[name] is of type T[K]
}

let names:string = getProperty(person,'name')

